package com.tedu.API.io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

/**
 * IO: 传输数据   C/S  聊天室 Version
 * API上部分: 字符串、包装类、日期类、集合
 * --------------电脑三大件:CPU  硬盘  内存
 * API下部分: IO流  ----硬盘----文件数据传输
 *
 * 包位置: java.io
 * File文件、文件夹类
 * 作用: 用于表示操作系统中系统的一个文件或者是目录(目录实际指文件夹)
 * 创建file对象--->必须具备有参构造器--->"路径+文件/文件夹全称"
 *
 * File类方法使用:
 * 1.查看该文件或者"文件夹: 目录"的属性信息(名字、大小、是否存在)
 * 2.操作文件或者"文件夹: 目录"(创建、删除)
 * 3.访问一个"文件夹: 目录"的子项
 */
public class FileAPI {
    @Test
    public void testFile(){
        //创建文件类
        //需求: 当前API下创建文件---手动----demo.txt  char r='\\'
       /* File file= new File("D:\\javaapi\\API\\src\\test\\" +
                "java\\com\\tedu\\API\\io\\demo.txt"); */

        //相对路径---当前API下创建文件!   项目: Maven结构  main编写代码
        //FileAPI.java   相对于  API  项目下--->从src开始
        //操作系统: 路径   \  代表路径  文件上传至服务器    √
        //               /  代表路径   文件下载到本地
        //java可以在任何平台【操作系统】运行  统一路径属性
        //File.separator 静态属性: 任何操作系统下转换为正确的路径表达方式
        File file=new File("src"+File.separator+"test"
                +File.separator+ "java"+File.separator
                +"com"+File.separator+"tedu"+File.separator
                +"API"+File.separator+"io"+File.separator
                +"demo.txt");

        //判断文件是否存在的方法
        boolean b=file.exists();
        System.out.println("判断文件是否存在"+b);  //true-->创建成功
    }

    /**
     * 查看文件或者文件夹属性信息;
     * getName()    返回值: String
     * 作用: 获取文件或者文件夹的名字【注意: 不看路径是否对错】
     * length()    返回值: long
     * 作用: 返回当前文件的大小【字节量】
     * exists()   返回值: boolean
     * 作用: 判断文件是否存在
     */
    @Test
    public void testFileGL() throws IOException {
        //创建文件类---路径: Maven项目---相对路径
        //相对路径: ./  当前API项目下
         File file=new File("."+File.separator+"demo.txt");
         //打印file的路径
        System.out.println("打印file路径"+file.getCanonicalPath());
        //文件是否存在
        System.out.println("路径文件是否存在: "+file.exists());
        //获取文件的名字/文件夹名字   不看对应路径对错，直接打印
        String name=file.getName();
        System.out.println("文件或者文件夹的名字: "+name);
        //获取文件的"大小：字节量"
        long len=file.length();
        System.out.println("获取文件大小【字节量】: "+len);
    }

    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用: 创建一个新文件
     * 需求: 使用代码完成API项目文件夹下 test.txt  文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类: 路径+全称    ./test.txt
        File file=new File("."
                +File.separator+"test.txt");
        //判断---如果文件不存在---false---创建
        //判断---如果文件存在----不创建
        if (!file.exists()){
            System.out.println("文件不存在~~");
            file.createNewFile();
            System.out.println("文件已经创建~~");
        }else{
            System.out.println("文件存在，别创建了~");
        }
    }

    /**
     * delete()
     * 作用: 删除文件或者文件夹
     * 需求: 将API项目下的 test.txt  删除
     */
    @Test
    public void testDelete(){
        //创建File类   路径:  ./test.txt   ./  不写代表 当前API文件夹
        File file=new File("test.txt");
        //判断  如果文件存在--->删除
        //     如果文件不存在--->删除
        if(file.exists()){
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件删除~~~");
        }else{
            System.out.println("文件已经删除~~~");
        }
    }

    /**
     * mkdir()
     * 作用: 创建一个文件夹
     * 需求: 在API项目下创建一个文件夹 demo
     *
     * 多层文件夹: demo/abc/bcd
     * mkdirs()
     * 作用: 创建多层文件夹
     */
    @Test
    public void testMkdir(){
        //创建File文件或文件夹(目录)--->创建demo文件夹 /abc  /bcd
        File file=new File("demo"+File.separator+
                          "abc"+File.separator+"bcd");
        //判断  如果demo文件不存在--创建文件夹
        //     如果demo文件存在----不创建文件夹
        if(!file.exists()){
            System.out.println("文件夹不存在~");
            file.mkdirs();
            System.out.println("创建文件夹");
        }else{
            System.out.println("文件已创建，别创建了~~");
        }
    }

    /**
     * 作业1: 多层文件夹  demo/abc/bcd, 删除  (不能使用递归)
     *   提示:    构造器 new File(File parent,"子路径");
     *           不需要exists判断
     *   思路: 找到每一级路径【bcd删除完毕-->abc删除完毕--->demo】
     */
   /* @Test
    public void testParent(){
       File parent=new File(pathname:"demo");
       File child=new File("abc"+File.separator+"bcd"+File.separator);
       System.out.println("输出");
   }*/
    @Test
    public void testHomeWork(){
        File file=new File("demo","abc"+File.separator+"bcd");
        file.delete();
        System.out.println("删除bcd");
        File file1=new File("demo","abc");
        file1.delete();
        System.out.println("删除abc");
        File file2=new File("demo");
        file2.delete();
        System.out.println("删除demo");
    }
    @Test
    public void testHomeWork1(){
        //1.创建多层文件夹 demo/abc/bcd
        File parent=new File("demo");
        //2.构造器使用(父级路径,子级路径) : 父级路径/子级路径
        File child1=new File(parent,"abc");
        File child2=new File(child1,"bcd");
        child2.delete();  //删除bcd
        child1.delete();  //删除abc
        parent.delete();  //删除demo

        //作业2: FileFilter接口按照 匿名内部类  方式  实现，  功能如上需求!
        //     接口: FileFilter ff=new  FileFilter()  { accept() }
        /*FileFilter ff=new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return false;
            }
        };*/
        parent.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return false;
            }
        });

    }

    /**
     * 访问文件夹---> 所有子项【文件夹和文件】
     * listFiles()  返回值: Files[]   文件数组
     * 作用: 获取一个文件夹的所有子项【包含文件夹和文件】
     *
     * isFile()    返回值: boolean
     * 作用: 判断是否为文件，是文件则true，反之不是文件
     *
     * isDirectory()  返回值: boolean
     * 作用: 判断是否为文件夹，是文件夹返回true,反之相同
     * 需求: 获取 API 项目下  所有的文件夹文字
     */
    @Test
    public void testListFiles() throws IOException {
        //获取 API 项目
        File file=new File("."+File.separator);
        System.out.println(file.getCanonicalPath());
        //过滤: 3个文件和4个文件夹，过滤是文件夹的
        if(file.isDirectory()){  //---过滤没有效果---
            //获取到所有的文件夹
            File[] dir=file.listFiles();
            //遍历所有文件夹内的名字
            for (int i=0;i<dir.length;i++){  //i  拿到所有下标
                //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }
}
